#include <stdio.h>
#include <stdlib.h>
#include "listaEnlazada.h"

void inicializarInstruccion(tInstruccion *instruccion) {
	instruccion->identificador = 0;
	instruccion->valor = 0;
}

void inicializarNodo(tNodo *nodo) {
	nodo->siguienteNodo = NULL;
	inicializarInstruccion(&(nodo->instruccion));
}

void alocarLista(tLista **lista) {
	*lista = (tLista *) malloc(sizeof(tLista));
	inicializarLista(*lista);
}

void inicializarLista(tLista *lista) {
	lista->nodos = NULL;
	lista->ultimoNodo = NULL;
}

/* Dados dos nodos permite enlazarlos, haciendo que el
 * primero apunte al segundo nodo. */
void enlazar(tNodo *unNodo, tNodo *otroNodo) {
	unNodo->siguienteNodo = otroNodo;
	otroNodo->siguienteNodo = NULL;
}

/* Agrega un nuevo valor a la lista de instrucciones. */
void agregar(tLista *lista, tInstruccion unaInstruccion) {
	tNodo *nodo = (tNodo *) malloc(sizeof(tNodo));
	inicializarNodo(nodo);
	nodo->instruccion = unaInstruccion;
	if(!lista->nodos) {
		lista->nodos = nodo;
		lista->ultimoNodo = lista->nodos;
	}
	else {
		enlazar(lista->ultimoNodo, nodo);
		lista->ultimoNodo = nodo;
	}
}

void borrarNodos(tNodo *nodo) {
	if(nodo->siguienteNodo)  // mas de un elemento
		borrarNodos(nodo->siguienteNodo);
	free(nodo);
	nodo = NULL;
}

/* Dada una lista libera todo el espacio ocupado por sus nodos. */
void borrarLista(tLista *lista) {
	if(lista->nodos)
		borrarNodos(lista->nodos);
}
